package com.crungoo.springaop;

/**
 * @author fujc-dev@qq.com
 * @date 2023/7/28 16:01
 */

public class FibonacciCalculator {
	/**
	 * 计算斐波那契数列的第n个数。
	 *
	 * @param n 需要计算的斐波那契数列的位置（从0开始）。
	 * @return 第n个斐波那契数。
	 * @throws IllegalArgumentException 当n小于0时，抛出异常。
	 *
	 * 示例：
	 * FibonacciCalculator fibonacci = new FibonacciCalculator();
	 * System.out.println(fibonacci.calculate(0)); // 输出: 0
	 * System.out.println(fibonacci.calculate(1)); // 输出: 1
	 * System.out.println(fibonacci.calculate(5)); // 输出: 5
	 * System.out.println(fibonacci.calculate(-1)); // 抛出IllegalArgumentException异常
	 */
	public int calculate(int n) {
		if (n < 0) {
			throw new IllegalArgumentException("n必须大于等于0");
		} else if (n == 0) {
			return 0;
		} else if (n == 1) {
			return 1;
		} else {
			// 初始化前两个斐波那契数
			int fib0 = 0;
			int fib1 = 1;
			int fibI = 0;

			for (int i = 2; i <= n; i++) {
				// 计算第i个斐波那契数，并更新fib0和fib1
				fibI = fib0 + fib1;
				fib0 = fib1;
				fib1 = fibI;
			}
			return fibI;
		}
	}

	public static void main(String[] args) {
		FibonacciCalculator fibonacci = new FibonacciCalculator();
		System.out.println(fibonacci.calculate(0)); // 输出: 0
		System.out.println(fibonacci.calculate(1)); // 输出: 1
		System.out.println(fibonacci.calculate(5)); // 输出: 5
	}
}
